"""
主窗口
集成系统概览和进程监控页面，实现页面切换和定时刷新
"""

from PyQt5.QtWidgets import (QMainWindow, QTabWidget, QVBoxLayout, QWidget, 
                             QStatusBar, QMenuBar, QAction, QMessageBox,
                             QApplication)
from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal
from PyQt5.QtGui import QIcon, QFont
import sys
import os

# 导入自定义模块
from system_monitor import SystemMonitor
from ui.system_tab import SystemTab
from ui.process_tab import ProcessTab


class DataUpdateThread(QThread):
    """数据更新线程"""
    data_updated = pyqtSignal(dict)
    
    def __init__(self, monitor):
        super().__init__()
        self.monitor = monitor
        self.running = True
    
    def run(self):
        """线程运行方法"""
        while self.running:
            try:
                # 获取系统信息
                system_info = self.monitor.get_all_system_info()
                self.data_updated.emit(system_info)
                
                # 等待1秒
                self.msleep(1000)
                
            except Exception as e:
                print(f"数据更新线程错误: {e}")
                self.msleep(1000)
    
    def stop(self):
        """停止线程"""
        self.running = False
        self.wait()


class MainWindow(QMainWindow):
    """主窗口类"""
    
    def __init__(self):
        super().__init__()
        self.monitor = SystemMonitor()
        self.data_thread = None
        self.init_ui()
        self.start_data_update()
    
    def init_ui(self):
        """初始化界面"""
        self.setWindowTitle("Windows 系统监控工具 v1.0")
        self.setGeometry(100, 100, 900, 700)
        self.setMinimumSize(800, 600)
        
        # 设置窗口图标（如果有的话）
        # self.setWindowIcon(QIcon('icon.ico'))
        
        # 创建中央部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        # 创建主布局
        layout = QVBoxLayout()
        central_widget.setLayout(layout)
        
        # 创建标签页控件
        self.tab_widget = QTabWidget()
        self.tab_widget.setFont(QFont("Microsoft YaHei", 10))
        
        # 创建系统概览页面
        self.system_tab = SystemTab()
        self.tab_widget.addTab(self.system_tab, "系统概览")
        
        # 创建进程监控页面
        self.process_tab = ProcessTab()
        self.tab_widget.addTab(self.process_tab, "进程监控")
        
        # 连接进程结束信号
        self.process_tab.kill_process_signal.connect(self.kill_process)
        
        layout.addWidget(self.tab_widget)
        
        # 创建菜单栏
        self.create_menu_bar()
        
        # 创建状态栏
        self.create_status_bar()
        
        # 设置样式
        self.setStyleSheet("""
            QMainWindow {
                background-color: #f5f5f5;
            }
            QTabWidget::pane {
                border: 1px solid #c0c0c0;
                background-color: white;
            }
            QTabWidget::tab-bar {
                alignment: left;
            }
            QTabBar::tab {
                background-color: #e0e0e0;
                border: 1px solid #c0c0c0;
                padding: 8px 16px;
                margin-right: 2px;
            }
            QTabBar::tab:selected {
                background-color: white;
                border-bottom-color: white;
            }
            QTabBar::tab:hover {
                background-color: #f0f0f0;
            }
        """)
    
    def create_menu_bar(self):
        """创建菜单栏"""
        menubar = self.menuBar()
        menubar.setFont(QFont("Microsoft YaHei", 9))
        
        # 文件菜单
        file_menu = menubar.addMenu('文件')
        
        # 刷新动作
        refresh_action = QAction('刷新数据', self)
        refresh_action.setShortcut('F5')
        refresh_action.triggered.connect(self.refresh_data)
        file_menu.addAction(refresh_action)
        
        file_menu.addSeparator()
        
        # 退出动作
        exit_action = QAction('退出', self)
        exit_action.setShortcut('Ctrl+Q')
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)
        
        # 帮助菜单
        help_menu = menubar.addMenu('帮助')
        
        # 关于动作
        about_action = QAction('关于', self)
        about_action.triggered.connect(self.show_about)
        help_menu.addAction(about_action)
    
    def create_status_bar(self):
        """创建状态栏"""
        self.status_bar = QStatusBar()
        self.status_bar.setFont(QFont("Microsoft YaHei", 9))
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage("系统监控工具已启动，正在获取数据...")
    
    def start_data_update(self):
        """开始数据更新"""
        try:
            # 创建并启动数据更新线程
            self.data_thread = DataUpdateThread(self.monitor)
            self.data_thread.data_updated.connect(self.update_all_data)
            self.data_thread.start()
            
            self.status_bar.showMessage("数据更新已启动，每秒自动刷新")
            
        except Exception as e:
            self.status_bar.showMessage(f"启动数据更新失败: {e}")
            print(f"启动数据更新失败: {e}")
    
    def update_all_data(self, system_info: dict):
        """更新所有页面的数据"""
        try:
            # 更新系统概览页面
            self.system_tab.update_data(system_info)
            
            # 更新进程监控页面
            self.process_tab.update_data(system_info)
            
            # 更新状态栏
            process_count = len(system_info.get('processes', []))
            cpu_usage = system_info.get('cpu', {}).get('usage_percent', 0)
            memory_usage = system_info.get('memory', {}).get('usage_percent', 0)
            
            status_text = (f"进程数: {process_count} | "
                          f"CPU: {cpu_usage:.1f}% | "
                          f"内存: {memory_usage:.1f}% | "
                          f"状态: 正常运行")
            self.status_bar.showMessage(status_text)
            
        except Exception as e:
            print(f"更新数据失败: {e}")
            self.status_bar.showMessage(f"数据更新失败: {e}")
    
    def refresh_data(self):
        """手动刷新数据"""
        try:
            self.status_bar.showMessage("正在刷新数据...")
            # 数据会通过线程自动更新，这里只是更新状态提示
            QTimer.singleShot(500, lambda: self.status_bar.showMessage("数据已刷新"))
            
        except Exception as e:
            self.status_bar.showMessage(f"刷新数据失败: {e}")
    
    def kill_process(self, pid: int):
        """结束进程"""
        try:
            success, message = self.monitor.kill_process(pid)
            self.process_tab.show_kill_result(success, message)
            
            if success:
                # 进程结束成功，立即刷新数据
                self.refresh_data()
                
        except Exception as e:
            error_msg = f"结束进程时发生错误: {str(e)}"
            self.process_tab.show_kill_result(False, error_msg)
    
    def show_about(self):
        """显示关于对话框"""
        about_text = """
        <h3>Windows 系统监控工具 v1.0</h3>
        <p>一个基于 Python 开发的轻量级系统监控工具</p>
        
        <p><b>主要功能：</b></p>
        <ul>
        <li>实时监控 CPU、内存、磁盘、网络状态</li>
        <li>进程管理和监控</li>
        <li>支持进程搜索和结束操作</li>
        <li>简洁直观的用户界面</li>
        </ul>
        
        <p><b>技术栈：</b></p>
        <ul>
        <li>Python 3.x</li>
        <li>PyQt5 - 图形界面框架</li>
        <li>psutil - 系统信息获取</li>
        <li>PyInstaller - 程序打包</li>
        </ul>
        
        <p><b>注意事项：</b></p>
        <p>结束系统关键进程可能导致系统不稳定，请谨慎操作。<br>
        建议以管理员权限运行以获得完整功能。</p>
        
        <p style="text-align: center; margin-top: 20px;">
        <i>© 2024 系统监控工具</i>
        </p>
        """
        
        QMessageBox.about(self, "关于", about_text)
    
    def closeEvent(self, event):
        """窗口关闭事件"""
        try:
            # 停止数据更新线程
            if self.data_thread and self.data_thread.isRunning():
                self.data_thread.stop()
            
            # 确认退出
            reply = QMessageBox.question(
                self, 
                '确认退出', 
                '确定要退出系统监控工具吗？',
                QMessageBox.Yes | QMessageBox.No,
                QMessageBox.No
            )
            
            if reply == QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()
                
        except Exception as e:
            print(f"关闭窗口时发生错误: {e}")
            event.accept()


def main():
    """主函数"""
    app = QApplication(sys.argv)
    
    # 设置应用程序信息
    app.setApplicationName("Windows 系统监控工具")
    app.setApplicationVersion("1.0")
    app.setOrganizationName("SystemMonitor")
    
    # 设置应用程序样式
    app.setStyle('Fusion')
    
    # 创建主窗口
    window = MainWindow()
    window.show()
    
    # 运行应用程序
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()